home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok02.lha / IntuiStruct / IntuiStruct.mod < prev    next >
Encoding:
Modula Implementation  |  1993-08-16  |  8.7 KB  |  378 lines

  1. (**********************************************************************
  2.  
  3.     :Program.       IntuiStruct.mod
  4.     :Author.        Nicolas Benezan
  5.     :Address.    Postwiesenstr. 2, D7000 Stuttgart 60
  6.     :Phone.      0711/333679
  7.     :shortcut.      [bne]
  8.     :Version.       1.0a   
  9.     :Date.          23.05.88
  10.     :Copyright.  Public Domain (siehe ReadMe)
  11.     :Language.      Modula-II
  12.     :Translator. M2Amiga AMSoft
  13.     :Update     
  14.     :Contents.     Easy initializing of Intuition structures
  15.     :Remark.     Copy and use it but please leave my name in, thanks.
  16.     
  17. **********************************************************************)
  18.  
  19. IMPLEMENTATION MODULE IntuiStruct;
  20.  
  21. FROM Intuition    IMPORT NewScreen,ScreenFlagSet,NewWindow,IDCMPFlagSet,
  22.         WindowFlagSet,ScreenPtr,stdScreenHeight,Image,ImagePtr,
  23.                 IntuiText,IntuiTextPtr,Gadget,GadgetPtr,GadgetFlagSet,
  24.                 GadgetFlags,ActivationFlagSet,PropInfo,PropInfoFlagSet,
  25.                 StringInfo,Menu,MenuPtr,MenuItem,MenuItemPtr,
  26.                 MenuItemFlagSet,MenuItemFlags,menuEnabled,WindowPtr,
  27.                 RefreshGadgets,RequesterPtr;
  28. FROM Graphics    IMPORT ViewModeSet,ViewModes,DrawModeSet,jam1;
  29. FROM GfxMacros    IMPORT RasSize;
  30. FROM SYSTEM    IMPORT ADR,ADDRESS,BITSET,LONGSET,WORD,CAST;
  31. FROM Exec    IMPORT Byte,UByte;
  32. FROM Arts    IMPORT Assert;
  33. FROM Heap    IMPORT Allocate,AllocMem,Deallocate;
  34.  
  35. CONST    CHIP=TRUE;
  36.     CorruptImage="Image Struct corrupt";
  37.  
  38. TYPE    WordPtr=POINTER TO CARDINAL;
  39. VAR    CurImagePtr:WordPtr;
  40.     Size,Count:INTEGER;
  41.         SubItemPtr,ItemPtr:MenuItemPtr;
  42.         MenuOK:BOOLEAN;
  43.  
  44. PROCEDURE StructScreen(VAR NewSc:NewScreen;Depth,Detail,Block:Byte;
  45.     Mode:ViewModeSet;Type:ScreenFlagSet;Title:ADDRESS);
  46. BEGIN
  47.   WITH NewSc DO
  48.     leftEdge:=0;
  49.     topEdge:=0;
  50.     IF hires IN Mode THEN
  51.       width:=640;
  52.     ELSE
  53.       width:=320;
  54.     END;
  55.     height:=stdScreenHeight;
  56.     depth:=Depth;
  57.     detailPen:=CAST(UByte,Detail);
  58.     blockPen:=CAST(UByte,Block);
  59.     viewModes:=Mode;
  60.     type:=Type;
  61.     font:=NIL;
  62.     defaultTitle:=Title;
  63.     gadgets:=NIL;
  64.     customBitMap:=NIL;
  65.   END;
  66. END StructScreen;
  67.  
  68. PROCEDURE StructWindow(VAR NewW:NewWindow;Left,Top,Width,Height:INTEGER;
  69.     Detail,Block:Byte;IDCMP:IDCMPFlagSet;Flags:WindowFlagSet;
  70.         Title:ADDRESS;Screen:ScreenPtr;Type:ScreenFlagSet);
  71. BEGIN
  72.   WITH NewW DO
  73.     leftEdge:=Left;
  74.     topEdge:=Top;
  75.     width:=Width;
  76.     height:=Height;
  77.     detailPen:=CAST(UByte,Detail);
  78.     blockPen:=CAST(UByte,Block);
  79.     idcmpFlags:=IDCMP;
  80.     flags:=Flags;
  81.     firstGadget:=NIL;
  82.     checkMark:=NIL;
  83.     title:=Title;
  84.     screen:=Screen;
  85.     bitMap:=NIL;
  86.     type:=Type;
  87.     minWidth:=0;
  88.     minHeight:=0;
  89.     maxWidth:=0;
  90.     maxHeight:=0;
  91.   END;
  92. END StructWindow;
  93.     
  94. PROCEDURE StructImage(VAR NewImage:Image;Left,Top,Width,Height,Depth:
  95.     INTEGER;Pick,OnOff:BITSET;Next:ImagePtr);
  96. BEGIN
  97.   Assert(Size=0,ADR(CorruptImage));
  98.   WITH NewImage DO
  99.     leftEdge:=Left;
  100.     topEdge:=Top;
  101.     width:=Width;
  102.     height:=Height;
  103.     depth:=Depth;
  104.     IF Depth#0 THEN
  105.       Size:=2*depth*height*((width-1)DIV 16 +1);
  106.       AllocMem(imageData,Size,CHIP);
  107.     END;
  108.     planePick:=CAST(CARDINAL,Pick);
  109.     planeOnOff:=CAST(CARDINAL,OnOff);
  110.     nextImage:=Next;
  111.   END;
  112.   Count:=0;
  113.   CurImagePtr:=NewImage.imageData;
  114. END StructImage;
  115.     
  116. PROCEDURE Word(Data:CARDINAL);
  117. BEGIN
  118.   Assert((CurImagePtr#NIL)AND(Count<Size-1),ADR(CorruptImage));
  119.   CurImagePtr^:=Data;
  120.   INC(CurImagePtr,2);
  121.   INC(Count,2);
  122. END Word;
  123.  
  124. PROCEDURE Long(Data:LONGCARD);
  125. BEGIN
  126.   Word(Data DIV 10000H);
  127.   Word(Data MOD 10000H);
  128. END Long;
  129.  
  130. PROCEDURE ImageEnd;
  131. BEGIN
  132.   Assert(Count=Size,ADR(CorruptImage));
  133.   Size:=0;
  134.   Count:=-1;
  135.   CurImagePtr:=NIL;
  136. END ImageEnd;
  137.  
  138. PROCEDURE StructText(VAR IText:IntuiText;APen,BPen:Byte;Mode:DrawModeSet;
  139.     Left,Top:INTEGER;Text:ADDRESS;Next:IntuiTextPtr);
  140. BEGIN
  141.   WITH IText DO
  142.     frontPen:=CAST(UByte,APen);
  143.     backPen:=CAST(UByte,BPen);
  144.     drawMode:=Mode;
  145.     leftEdge:=Left;
  146.     topEdge:=Top;
  147.     iTextFont:=NIL;
  148.     iText:=Text;
  149.     nextText:=Next;
  150.   END;
  151. END StructText;
  152.   
  153. PROCEDURE StructGadget(VAR NewGadg:Gadget;Left,Top,Width,Height:INTEGER;
  154.     Flags:GadgetFlagSet;Activ:ActivationFlagSet;Type:CARDINAL;
  155.         Render:ADDRESS;Text:IntuiTextPtr;Excl:LONGSET;ID:INTEGER;
  156.         Next:GadgetPtr);
  157. BEGIN
  158.   WITH NewGadg DO
  159.     nextGadget:=Next;
  160.     leftEdge:=Left;
  161.     topEdge:=Top;
  162.     width:=Width;
  163.     height:=Height;
  164.     flags:=Flags;
  165.     activation:=Activ;
  166.     gadgetType:=Type;
  167.     gadgetRender:=Render;
  168.     selectRender:=NIL;
  169.     gadgetText:=Text;
  170.     mutualExclude:=Excl;
  171.     specialInfo:=NIL;
  172.     gadgetID:=ID;
  173.     userData:=NIL;
  174.   END;
  175. END StructGadget;
  176.  
  177. PROCEDURE ExcludeGadget(Gadgets:GadgetPtr;Window:WindowPtr;
  178.         Requester:RequesterPtr;Mask:LONGSET);
  179. VAR    TempPtr:GadgetPtr;
  180.     Bit:INTEGER;
  181. BEGIN
  182.   Bit:=0;
  183.   WHILE (Gadgets#NIL)AND(Bit<32) DO
  184.     IF (Bit IN Mask)AND(selected IN Gadgets^.flags) THEN
  185.       WITH Gadgets^ DO
  186.         flags:=flags-GadgetFlagSet{selected};
  187.         TempPtr:=nextGadget;
  188.         nextGadget:=NIL;
  189.         RefreshGadgets(Gadgets,Window,Requester);
  190.         nextGadget:=TempPtr;
  191.       END;
  192.     END;
  193.     Gadgets:=Gadgets^.nextGadget;
  194.     INC(Bit);
  195.   END;
  196. END ExcludeGadget;
  197.  
  198. PROCEDURE StructProp(VAR Info:PropInfo;Flags:PropInfoFlagSet;
  199.     HPot,VPot,HBody,VBody:CARDINAL);
  200. BEGIN
  201.   WITH Info DO
  202.     flags:=Flags;
  203.     horizPot:=HPot;
  204.     vertPot:=VPot;
  205.     horizBody:=HBody;
  206.     vertBody:=VBody;
  207.   END;
  208. END StructProp;
  209.  
  210. PROCEDURE StructString(VAR Info:StringInfo;VAR Buffer,UndoBuf:
  211.     ARRAY OF CHAR);
  212. BEGIN
  213.   WITH Info DO
  214.     buffer:=ADR(Buffer);
  215.     undoBuffer:=ADR(UndoBuf);
  216.     bufferPos:=0;
  217.     maxChars:=HIGH(Buffer);
  218.     dispPos:=0;
  219.   END;
  220.   Assert(HIGH(UndoBuf)>=Info.maxChars,
  221.     ADR("StringGadget: UndoBuf too small"));
  222. END StructString;
  223.  
  224. PROCEDURE LinkItems(ItemPtr:MenuItemPtr);
  225. VAR    TopEdge:INTEGER;
  226. BEGIN
  227.   TopEdge:=0;
  228.   WHILE ItemPtr#NIL DO
  229.     WITH ItemPtr^ DO
  230.       topEdge:=TopEdge;
  231.       IF subItem#NIL THEN
  232.         LinkItems(subItem);
  233.       END;
  234.     END;
  235.     INC(TopEdge,StdHeight);
  236.     ItemPtr:=ItemPtr^.nextItem;
  237.   END;
  238. END LinkItems;
  239.   
  240. PROCEDURE LinkMenu(VAR MenuStrip:MenuPtr;Name:ADDRESS;Pos,Width:
  241.     INTEGER;Enabled:BOOLEAN):BOOLEAN;
  242. VAR    TempPtr:MenuPtr;
  243. BEGIN
  244.   IF MenuOK THEN
  245.     Assert(SubItemPtr=NIL,ADR("Menu Struct corrupt"));
  246.     Allocate(TempPtr,SIZE(Menu));
  247.     IF TempPtr#NIL THEN
  248.       TempPtr^.nextMenu:=MenuStrip;
  249.       MenuStrip:=TempPtr;
  250.       WITH MenuStrip^ DO
  251.         leftEdge:=Pos;
  252.         topEdge:=0;
  253.         width:=Width;
  254.         height:=StdHeight;
  255.         IF Enabled THEN
  256.           flags:={menuEnabled};
  257.         ELSE
  258.           flags:={};
  259.         END;
  260.         menuName:=Name;
  261.         firstItem:=ItemPtr;
  262.         LinkItems(ItemPtr);
  263.       END;
  264.       ItemPtr:=NIL;
  265.       RETURN TRUE;
  266.     END;
  267.   END;
  268.   ItemPtr:=NIL;
  269.   MenuOK:=TRUE;
  270.   RETURN FALSE;
  271. END LinkMenu;
  272.  
  273. PROCEDURE InitItem(VAR ItemPtr:MenuItemPtr):BOOLEAN;
  274. VAR    TempPtr:MenuItemPtr;
  275. BEGIN
  276.   Allocate(TempPtr,SIZE(MenuItem));
  277.   IF TempPtr#NIL THEN
  278.     Allocate(TempPtr^.itemFill,SIZE(IntuiText));
  279.     IF TempPtr^.itemFill#NIL THEN
  280.       TempPtr^.nextItem:=ItemPtr;
  281.       ItemPtr:=TempPtr;
  282.       RETURN TRUE;
  283.     ELSE
  284.       Deallocate(TempPtr);
  285.     END;
  286.   END;
  287.   MenuOK:=FALSE;
  288.   RETURN FALSE;
  289. END InitItem;
  290.  
  291. PROCEDURE InitText(VAR TextPtr:IntuiTextPtr;Text:ADDRESS;Flags:
  292.     MenuItemFlagSet);
  293. BEGIN
  294.   WITH TextPtr^ DO
  295.     frontPen:=0;
  296.     drawMode:=jam1;
  297.     IF checkIt IN Flags THEN
  298.       leftEdge:=CheckWidth;
  299.     ELSE
  300.       leftEdge:=0;
  301.     END;
  302.     topEdge:=1;
  303.     iTextFont:=NIL;
  304.     iText:=Text;
  305.   END;
  306. END InitText;
  307.  
  308. PROCEDURE Item(Name:ADDRESS;Width:INTEGER;Flags:MenuItemFlagSet;
  309.     Excl:LONGSET;Cmd:CHAR);
  310. BEGIN
  311.   IF InitItem(ItemPtr) THEN
  312.     WITH ItemPtr^ DO
  313.       leftEdge:=0;
  314.       width:=Width;
  315.       IF checkIt IN Flags THEN
  316.         INC(width,CheckWidth);
  317.       END;
  318.       height:=StdHeight;
  319.       flags:=Flags;
  320.       mutualExclude:=Excl;
  321.       command:=Cmd;
  322.       subItem:=SubItemPtr;
  323.       InitText(CAST(IntuiTextPtr,itemFill),Name,Flags);
  324.     END;
  325.   END;
  326.   SubItemPtr:=NIL;
  327. END Item;
  328.  
  329. PROCEDURE SubItem(Name:ADDRESS;LeftEdge,Width:INTEGER;Flags:
  330.     MenuItemFlagSet;Excl:LONGSET;Cmd:CHAR);
  331. BEGIN
  332.   IF InitItem(SubItemPtr) THEN
  333.     WITH SubItemPtr^ DO
  334.       leftEdge:=LeftEdge;
  335.       width:=Width;
  336.       height:=StdHeight;
  337.       flags:=Flags;
  338.       mutualExclude:=Excl;
  339.       command:=Cmd;
  340.       subItem:=NIL;
  341.       InitText(CAST(IntuiTextPtr,itemFill),Name,Flags);
  342.     END;
  343.   END;
  344. END SubItem;
  345.  
  346. PROCEDURE MenuNum(Num:CARDINAL):CARDINAL;
  347. BEGIN
  348.   RETURN Num MOD 0020H;
  349. END MenuNum;
  350.  
  351. PROCEDURE ItemNum(Num:CARDINAL):CARDINAL;
  352. BEGIN
  353.   RETURN Num DIV 0020H MOD 0040H;
  354. END ItemNum;
  355.  
  356. PROCEDURE SubNum(Num:CARDINAL):CARDINAL;
  357. BEGIN
  358.   RETURN Num DIV 0800H;
  359. END SubNum;
  360.  
  361. PROCEDURE MakeNum(Menu,Item,SubItem:CARDINAL):CARDINAL;
  362. BEGIN
  363.   RETURN (Menu MOD 20H)+(Item MOD 40H)*0020H+(SubItem MOD 20H)*800H;
  364. END MakeNum;
  365.  
  366. BEGIN
  367.   CurImagePtr:=NIL;
  368.   ItemPtr:=NIL;
  369.   SubItemPtr:=NIL;
  370.   Size:=0;
  371.   Count:=-1;
  372.   CommWidth:=48;
  373.   CheckWidth:=24;
  374.   StdHeight:=10;
  375.   MenuOK:=TRUE;
  376.   
  377. END IntuiStruct.
  378.